/**
  ******************************************************************************
  * @file    sym32l010_hal_iwdt.h
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   Header file of IWDT HAL module.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SYM32L010_HAL_IWDT_H
#define __SYM32L010_HAL_IWDT_H

#ifdef __cplusplus
extern "C" {
#endif


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_def.h"


/******************************************************************************/
/* Global type definitions                                                    */
/******************************************************************************/
/* IWDT 时钟分频 --------------------------------------------------------------*/
typedef enum
{
    IWDT_PRS_4                 = (0UL << IWDT_CR_PRS_Pos),            // 4 分频
    IWDT_PRS_8                 = (1UL << IWDT_CR_PRS_Pos),            // 8 分频
    IWDT_PRS_16                = (2UL << IWDT_CR_PRS_Pos),            // 16 分频
    IWDT_PRS_32                = (3UL << IWDT_CR_PRS_Pos),            // 32 分频
    IWDT_PRS_64                = (4UL << IWDT_CR_PRS_Pos),            // 64 分频
    IWDT_PRS_128               = (5UL << IWDT_CR_PRS_Pos),            // 128 分频
    IWDT_PRS_256               = (6UL << IWDT_CR_PRS_Pos),            // 256 分频
    IWDT_PRS_512               = (7UL << IWDT_CR_PRS_Pos)             // 512 分频
} IWDT_PrescalerTypeDef;

/* IWDT 溢出动作 --------------------------------------------------------------*/
typedef enum
{
    IWDT_ACTION_RESET          = (0UL << IWDT_CR_ACTION_Pos),         // 溢出复位
    IWDT_ACTION_INTERRUPT      = ((1UL << IWDT_CR_ACTION_Pos) | IWDT_CR_IE_Msk) // 溢出中断
} IWDT_ActionTypeDef;

/* IWDT Deepsleep模式下的工作状态----------------------------------------------*/
typedef enum
{
    IWDT_DEEPSLEEP_RUN         = (0UL << IWDT_CR_PAUSE_Pos),          // Deepsleep模式下继续运行
    IWDT_DEEPSLEEP_PAUSE       = (1UL << IWDT_CR_PAUSE_Pos)           // Deepsleep模式下自动暂停
} IWDT_DeepSleepModeTypeDef;

/* IWDT 结构体----------------------------------------------------------------*/
typedef struct
{
    uint16_t                     Reload;                              // 重装载值  (0 ... 0xFFF)
    uint16_t                     Window;                              // 窗口比较值(0 ... 0xFFF)
    IWDT_PrescalerTypeDef        Prescaler;                           // 分频系数
    IWDT_ActionTypeDef           Action;                              // 溢出动作
    IWDT_DeepSleepModeTypeDef    DeepSleepMode;                       // Deepsleep模式下IWDT暂停控制
} IWDT_InitTypeDef;


/******************************************************************************/
/* Global pre-processor symbols/macros ('#define')                            */
/******************************************************************************/
/* IWDT 状态标志 --------------------------------------------------------------*/
#define IWDT_SR_FLAG_CRF               (IWDT_SR_CRF_Msk)              // CR   更新标志
#define IWDT_SR_FLAG_ARRF              (IWDT_SR_ARRF_Msk)             // ARR  更新标志
#define IWDT_SR_FLAG_WINRF             (IWDT_SR_WINRF_Msk)            // WINR 更新标志
#define IWDT_SR_FLAG_OV                (IWDT_SR_OV_Msk)               // 溢出标志
#define IWDT_SR_FLAG_RUN               (IWDT_SR_RUN_Msk)              // 运行标志
#define IWDT_SR_FLAG_RELOAD            (IWDT_SR_RELOAD_Msk)           // 重载标志


/******************************************************************************/
/* Global macro function                                                      */
/******************************************************************************/
/**
  * @brief  获取 IWDT 中断
  * @param
  * @retval
  */
#define HAL_IWDT_GET_IT_SOURCE()       (SYM_IWDT->CR & IWDT_CR_IE_Msk)

/**
  * @brief  使能 IWDT 中断
  * @param
  * @retval
  */
#define HAL_IWDT_ENABLE_IT()           (SYM_IWDT->CR |= IWDT_ACTION_INTERRUPT)

/**
  * @brief  关闭 IWDT 中断
  * @param
  * @retval
  */
#define HAL_IWDT_DISABLE_IT()          (SYM_IWDT->CR &= ~((uint32_t)(IWDT_CR_IE_Msk)))

/**
  * @brief  获取 IWDT 状态标志
  * @param  FLAG: IWDT 状态标志位
  *               @arg IWDT_SR_FLAG_CRF
  *               @arg IWDT_SR_FLAG_ARRF
  *               @arg IWDT_SR_FLAG_WINRF
  *               @arg IWDT_SR_FLAG_OV
  *               @arg IWDT_SR_FLAG_RUN
  *               @arg IWDT_SR_FLAG_RELOAD
  * @retval
  */
#define HAL_IWDT_GET_FLAG(FLAG)        (SYM_IWDT->SR & (FLAG))

/**
  * @brief  清除 IWDT 状态标志
  * @param  FLAG: IWDT 状态标志位
  *               @arg IWDT_SR_FLAG_OV
  * @retval
  */
#define HAL_IWDT_CLR_FLAG(FLAG)        (SYM_IWDT->SR = 0x0U)


/******************************************************************************/
/* Exported variables ('extern', definition in C source)                      */
/******************************************************************************/


/******************************************************************************/
/* Global function prototypes ('extern', definition in C source)              */
/******************************************************************************/
void HAL_IWDT_Init(IWDT_InitTypeDef *InitStruct);
void HAL_IWDT_Window_Refresh(void);
void HAL_IWDT_Refresh(void);
void HAL_IWDT_Stop(void);


#ifdef __cplusplus
}
#endif

#endif /* __SYM32L010_HAL_IWDT_H */


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
